package testutil

import (
	"database/sql"
	"os"
	"testing"
	"time"

	"github.com/go-redis/redis/v8"
	_ "github.com/go-sql-driver/mysql"
	"goserver/internal/config"
)

// TestDB 测试数据库连接
func TestDB(t *testing.T) *sql.DB {
	db, err := sql.Open("mysql", "root:your_password@tcp(localhost:3306)/worktool_test?charset=utf8mb4&parseTime=True")
	if err != nil {
		t.Fatalf("连接测试数据库失败: %v", err)
	}

	// 设置连接池
	db.SetMaxOpenConns(10)
	db.SetMaxIdleConns(5)
	db.SetConnMaxLifetime(time.Hour)

	return db
}

// TestRedis 测试Redis连接
func TestRedis(t *testing.T) *redis.Client {
	rdb := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "",
		DB:       1, // 使用DB 1作为测试库
	})

	return rdb
}

// LoadTestConfig 加载测试配置
func LoadTestConfig(t *testing.T) {
	err := config.LoadConfig("../../config/config.test.yaml")
	if err != nil {
		t.Fatalf("加载测试配置失败: %v", err)
	}
}

// SetupTestDB 设置测试数据库
func SetupTestDB(t *testing.T) *sql.DB {
	db := TestDB(t)
	
	// 执行测试数据库初始化脚本
	data, err := os.ReadFile("../../scripts/mysql/init.sql")
	if err != nil {
		t.Fatalf("读取数据库初始化脚本失败: %v", err)
	}

	_, err = db.Exec(string(data))
	if err != nil {
		t.Fatalf("执行数据库初始化脚本失败: %v", err)
	}

	return db
}

// CleanupTestDB 清理测试数据库
func CleanupTestDB(t *testing.T, db *sql.DB) {
	// 清理所有表
	tables := []string{
		"wqyf_users",
		"wqyf_robot_codes",
		"wqyf_messages_1",
		"wqyf_messages_2",
	}

	for _, table := range tables {
		_, err := db.Exec("TRUNCATE TABLE " + table)
		if err != nil {
			t.Errorf("清理表 %s 失败: %v", table, err)
		}
	}
} 